import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 商品服务类，负责商品数据的管理、持久化和配置加载
 */
public class ProductService {
    // 存储商品的Map集合（键：商品ID，值：商品对象）
    private Map<String, Product> productMap = new HashMap<>();
    // 数据文件路径（从配置文件读取）
    private String dataFilePath;

    // 构造方法：初始化时加载配置和数据
    public ProductService() {
        loadConfig();   // 先加载配置
        loadData();     // 再加载数据
    }

    /**
     * 加载配置文件，获取数据文件路径
     */
    private void loadConfig() {
        Properties properties = new Properties();
        try (
                // 使用转换流指定UTF-8编码读取配置文件
                InputStreamReader reader = new InputStreamReader(
                        new FileInputStream("config.properties"),
                        "UTF-8"
                )
        ) {
            properties.load(reader);
            // 读取配置项，默认值为"products.dat"
            dataFilePath = properties.getProperty("data.file.path", "products.dat");
            System.out.println("配置加载成功，数据文件路径：" + dataFilePath);
        } catch (IOException e) {
            // 配置文件不存在时使用默认路径
            System.out.println("配置文件加载失败，使用默认路径：products.dat");
            dataFilePath = "products.dat";
        }
    }

    /**
     * 将商品数据保存到文件（持久化）
     */
    public void saveData() {
        try (
                // 对象输出流：将Map对象写入文件
                ObjectOutputStream oos = new ObjectOutputStream(
                        new FileOutputStream(dataFilePath)
                )
        ) {
            oos.writeObject(productMap);
            System.out.println("数据保存成功，共" + productMap.size() + "条商品数据");
        } catch (IOException e) {
            System.out.println("数据保存失败：" + e.getMessage());
        }
    }

    /**
     * 从文件加载商品数据
     */
    @SuppressWarnings("unchecked")  // 抑制类型转换警告
    public void loadData() {
        File dataFile = new File(dataFilePath);
        if (!dataFile.exists()) {
            System.out.println("数据文件不存在，初始化空数据");
            return;
        }

        try (
                // 对象输入流：从文件读取Map对象
                ObjectInputStream ois = new ObjectInputStream(
                        new FileInputStream(dataFilePath)
                )
        ) {
            // 强制转换为Map类型（需确保序列化对象类型匹配）
            productMap = (Map<String, Product>) ois.readObject();
            System.out.println("数据加载成功，共" + productMap.size() + "条商品数据");
        } catch (IOException | ClassNotFoundException e) {
            System.out.println("数据加载失败：" + e.getMessage());
        }
    }

    /**
     * 数据备份方法：使用字节流复制文件
     */
    public void backupData() {
        // 备份文件路径（源文件路径 + .bak后缀）
        String backupFilePath = dataFilePath + ".bak";

        try (
                // 字节输入流：读取源文件
                FileInputStream fis = new FileInputStream(dataFilePath);
                // 字节输出流：写入备份文件
                FileOutputStream fos = new FileOutputStream(backupFilePath)
        ) {
            byte[] buffer = new byte[1024];  // 1KB缓冲区
            int readLen;  // 每次读取的字节数

            // 循环读取-写入：直到文件末尾（read返回-1）
            while ((readLen = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, readLen);  // 写入实际读取的字节数
            }
            System.out.println("数据备份成功，备份文件：" + backupFilePath);
        } catch (FileNotFoundException e) {
            System.out.println("备份失败：源文件不存在");
        } catch (IOException e) {
            System.out.println("备份失败：" + e.getMessage());
        }
    }

    // 以下为商品管理的业务方法（示例）
    /**
     * 添加商品
     */
    public void addProduct(Product product) {
        productMap.put(product.getId(), product);
    }

    /**
     * 查询商品
     */
    public Product getProduct(String id) {
        return productMap.get(id);
    }

    /**
     * 获取所有商品
     */
    public Map<String, Product> getAllProducts() {
        return productMap;
    }

    // 供外部获取数据文件路径（用于备份验证）
    public String getDataFilePath() {
        return dataFilePath;
    }
}